Micron Document
Aleph Git

Node / mirrors / interface_http / files / HTTPInterface.py

Displaying Raw • Download

HTTPInterface.py 8a2c20df0bdd47339b81dfd39aebd3711ee83bed (8a2c20df) Text, 12.24 KB

Tff7b72import T7ee787os
Tff7b72import T7ee787threading
Tff7b72import T7ee787time
Tff7b72from T7ee787httpT7ee787.T7ee787server Tff7b72import Te6edf3BaseHTTPRequestHandlerTb4b4b4, Te6edf3HTTPServer
Tff7b72from T7ee787queue Tff7b72import Te6edf3EmptyTb4b4b4, Te6edf3Queue
Tff7b72from T7ee787socketserver Tff7b72import Te6edf3ThreadingMixIn
Tff7b72from T7ee787threading Tff7b72import Te6edf3EventTb4b4b4, Te6edf3Thread

Tff7b72import T7ee787requests
Tff7b72import T7ee787RNS
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787Interface Tff7b72import Te6edf3Interface


Tff7b72class T56d364HTTPTunnelInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
T8b949e"""HTTP Tunnel Interface for Reticulum.

This interface implements bidirectional communication over HTTP POST requests,
allowing Reticulum to traverse firewalls and proxies that allow HTTP/HTTPS traffic.

Configuration:
mode: "client" or "server"
listen_host: IP address to bind server to (server mode)
listen_port: Port to bind server to (server mode)
server_url: URL of the HTTP server (client mode)
poll_interval: Polling interval in seconds for client (default: 0.1)
check_user_agent: Enable User-Agent validation (default: True)
serve_html_page: Serve HTML page on GET requests (default: False)
html_file_path: Path to HTML file to serve (optional)

Config example for server:
[[HTTP Tunnel Server]]
type = HTTPTunnelInterface
interface_enabled = True
mode = server
listen_host = 0.0.0.0
listen_port = 8080

Config example for server with HTML:
[[HTTP Tunnel Server]]
type = HTTPTunnelInterface
interface_enabled = True
mode = server
listen_host = 0.0.0.0
listen_port = 8080
serve_html_page = True
html_file_path = index.html

Config example for client:
[[HTTP Tunnel Client]]
type = HTTPTunnelInterface
interface_enabled = True
mode = client
server_url = http://example.com:8080/
poll_interval = 0.1
"""

Te6edf3DEFAULT_IFAC_SIZE Tff7b72= T79c0ff16
Te6edf3BITRATE_GUESS Tff7b72= T79c0ff10_000_000
Te6edf3AUTOCONFIGURE_MTU Tff7b72= Tff7b72True

Te6edf3DEFAULT_MTU Tff7b72= T79c0ff4096
Te6edf3TUNNEL_USER_AGENT Tff7b72= Ta5d6ff"Ta5d6ffRNS-HTTP-Tunnel/1.0Ta5d6ff"
Te6edf3DEFAULT_POLL_INTERVAL Tff7b72= T79c0ff0.1

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3configurationTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)

Te6edf3ifconf Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffget_config_objTb4b4b4(Te6edf3configurationTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]

Te6edf3mode Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffmodeTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Ta5d6ff"Ta5d6ffclientTa5d6ff"
Te6edf3listen_host Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6fflisten_hostTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6fflisten_hostTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Ta5d6ff"Ta5d6ff0.0.0.0Ta5d6ff"
Te6edf3listen_port Tff7b72= Tffa657intTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6fflisten_portTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else T79c0ff8080
Te6edf3server_url Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffserver_urlTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffserver_urlTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72None
Te6edf3poll_interval Tff7b72= Tffa657floatTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffpoll_intervalTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffpoll_intervalTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_POLL_INTERVAL
Te6edf3check_user_agent Tff7b72= Te6edf3ifconfTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffcheck_user_agentTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffcheck_user_agentTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72True
Te6edf3mtu Tff7b72= Tffa657intTb4b4b4(Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffmtuTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffmtuTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_MTU
Te6edf3serve_html_page Tff7b72= Te6edf3ifconfTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffserve_html_pageTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffserve_html_pageTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72False
Te6edf3html_file_path Tff7b72= Te6edf3ifconfTb4b4b4[Ta5d6ff"Ta5d6ffhtml_file_pathTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffhtml_file_pathTa5d6ff" Tff7b72in Te6edf3ifconf Tff7b72else Tff7b72None

Tff7b72if Te6edf3mode Tff7b72not Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid mode Ta5d6ff'Tffd700{Te6edf3modeTffd700}Ta5d6ff'Ta5d6ff for Tffd700{Tff7b72selfTffd700}Ta5d6ff. Must be Ta5d6ff'Ta5d6ffclientTa5d6ff'Ta5d6ff or Ta5d6ff'Ta5d6ffserverTa5d6ff'Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ffclientTa5d6ff" Tff7b72and Te6edf3server_url Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo server_url specified for client mode in Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Te6edf3mtu
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3HTTPTunnelInterfaceTff7b72.Td2a8ffBITRATE_GUESS
Tff7b72selfTff7b72.Td2a8ffoptimise_mtuTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3mode
Tff7b72selfTff7b72.Td2a8ffmtu Tff7b72= Te6edf3mtu
Tff7b72selfTff7b72.Td2a8ffcheck_user_agent Tff7b72= Te6edf3check_user_agent
Tff7b72selfTff7b72.Td2a8ffserve_html_page Tff7b72= Te6edf3serve_html_page
Tff7b72selfTff7b72.Td2a8ffhtml_file_path Tff7b72= Te6edf3html_file_path
Tff7b72selfTff7b72.Td2a8ffhtml_content Tff7b72= Tff7b72None

Tff7b72if Tff7b72selfTff7b72.Td2a8ffserve_html_page Tff7b72and Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_load_html_contentTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_recv_queue Tff7b72= Te6edf3QueueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_queue Tff7b72= Te6edf3QueueTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_stop_event Tff7b72= Te6edf3EventTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflisten_host Tff7b72= Te6edf3listen_host
Tff7b72selfTff7b72.Td2a8fflisten_port Tff7b72= Te6edf3listen_port
Tff7b72selfTff7b72.Td2a8ffsetup_serverTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffserver_url Tff7b72= Te6edf3server_url
Tff7b72selfTff7b72.Td2a8ffpoll_interval Tff7b72= Te6edf3poll_interval
Tff7b72selfTff7b72.Td2a8ffsetup_clientTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_load_html_contentTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhtml_content Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLoaded HTML content from Tffd700{Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHTML file not found: Tffd700{Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhtml_content Tff7b72= Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError loading HTML file Tffd700{Tff7b72selfTff7b72.Td2a8ffhtml_file_pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhtml_content Tff7b72= Tff7b72None

Tff7b72def Td2a8ffsetup_serverTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3interface_instance Tff7b72= Tff7b72self

Tff7b72class T56d364TunnelRequestHandlerTb4b4b4(Te6edf3BaseHTTPRequestHandlerTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffdo_GETTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72and Te6edf3interface_instanceTff7b72.Td2a8ffserve_html_page Tff7b72and Te6edf3interface_instanceTff7b72.Td2a8ffhtml_contentTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsend_responseTb4b4b4(T79c0ff200Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-TypeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftext/html; charset=utf-8Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-LengthTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3interface_instanceTff7b72.Td2a8ffhtml_contentTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffend_headersTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwfileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3interface_instanceTff7b72.Td2a8ffhtml_contentTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsend_responseTb4b4b4(T79c0ff404Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffend_headersTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffdo_POSTTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4:
Tff7b72if Te6edf3interface_instanceTff7b72.Td2a8ffcheck_user_agentTb4b4b4:
Te6edf3user_agent Tff7b72= Tff7b72selfTff7b72.Td2a8ffheadersTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffUser-AgentTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3user_agent Tff7b72!= Te6edf3HTTPTunnelInterfaceTff7b72.Td2a8ffTUNNEL_USER_AGENTTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRejected request with invalid User-Agent: Tffd700{Te6edf3user_agentTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_responseTb4b4b4(T79c0ff403Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-TypeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftext/plainTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffend_headersTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwfileTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffForbiddenTa5d6ff"Tb4b4b4)
Tff7b72return

Te6edf3content_length Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffheadersTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffContent-LengthTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3client_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffrfileTff7b72.Td2a8ffreadTb4b4b4(Te6edf3content_lengthTb4b4b4) Tff7b72if Te6edf3content_length Tff7b72> T79c0ff0 Tff7b72else Ta5d6ffbTa5d6ff"Ta5d6ff"

Tff7b72if Te6edf3client_dataTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReceived Tffd700{Tffa657lenTb4b4b4(Te6edf3client_dataTb4b4b4)Tffd700}Ta5d6ff bytes from clientTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3interface_instanceTff7b72.Td2a8ff_recv_queueTff7b72.Td2a8ffputTb4b4b4(Te6edf3client_dataTb4b4b4)

Te6edf3server_data_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72while Tff7b72not Te6edf3interface_instanceTff7b72.Td2a8ff_send_queueTff7b72.Td2a8ffemptyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3server_data_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interface_instanceTff7b72.Td2a8ff_send_queueTff7b72.Td2a8ffget_nowaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72except Te6edf3EmptyTb4b4b4:
Tff7b72break

Te6edf3server_data Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3server_data_partsTb4b4b4)
Tff7b72if Te6edf3server_dataTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSending Tffd700{Tffa657lenTb4b4b4(Te6edf3server_dataTb4b4b4)Tffd700}Ta5d6ff bytes (Tffd700{Tffa657lenTb4b4b4(Te6edf3server_data_partsTb4b4b4)Tffd700}Ta5d6ff chunks) to clientTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)

Tff7b72selfTff7b72.Td2a8ffsend_responseTb4b4b4(T79c0ff200Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-TypeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffapplication/octet-streamTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-LengthTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3server_dataTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffend_headersTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwfileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3server_dataTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsend_responseTb4b4b4(T79c0ff404Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffend_headersTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fflog_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3fmtTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72class T56d364ThreadedHTTPServerTb4b4b4(Te6edf3ThreadingMixInTb4b4b4, Te6edf3HTTPServerTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffrun_serverTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_http_server Tff7b72= Te6edf3ThreadedHTTPServerTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8fflisten_hostTb4b4b4, Tff7b72selfTff7b72.Td2a8fflisten_portTb4b4b4)Tb4b4b4, Te6edf3TunnelRequestHandlerTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_http_serverTff7b72.Td2a8ffserve_foreverTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHTTP server error for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffpanic_on_interface_errorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_server_thread Tff7b72= Te6edf3ThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3run_serverTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_server_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffreceive_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHTTP server started on http://Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_portTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)

Tff7b72def Td2a8ffsetup_clientTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsession Tff7b72= Te6edf3requestsTff7b72.Td2a8ffSessionTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsessionTff7b72.Td2a8ffheadersTff7b72.Td2a8ffupdateTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffUser-AgentTa5d6ff"Tb4b4b4: Te6edf3HTTPTunnelInterfaceTff7b72.Td2a8ffTUNNEL_USER_AGENTTb4b4b4}Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_max_backoff Tff7b72= T79c0ff30.0

Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffclient_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHTTP client started, connecting to Tffd700{Tff7b72selfTff7b72.Td2a8ffserver_urlTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)

Tff7b72def Td2a8ffreceive_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3received_data Tff7b72= Tff7b72selfTff7b72.Td2a8ff_recv_queueTff7b72.Td2a8ffgetTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3received_dataTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3received_dataTb4b4b4)
Tff7b72except Te6edf3EmptyTb4b4b4:
Tff7b72continue
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError in receive loop for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffclient_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3data_to_send Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_send_queueTff7b72.Td2a8ffemptyTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3data_to_send Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_queueTff7b72.Td2a8ffget_nowaitTb4b4b4(Tb4b4b4)
Tff7b72except Te6edf3EmptyTb4b4b4:
Tff7b72pass

Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSending Tffd700{Tffa657lenTb4b4b4(Te6edf3data_to_sendTb4b4b4)Tffd700}Ta5d6ff bytes to serverTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3response Tff7b72= Tff7b72selfTff7b72.Td2a8ffsessionTff7b72.Td2a8ffpostTb4b4b4(Tff7b72selfTff7b72.Td2a8ffserver_urlTb4b4b4, Te6edf3dataTff7b72=Te6edf3data_to_sendTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff5Tb4b4b4)
Te6edf3responseTff7b72.Td2a8ffraise_for_statusTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3responseTff7b72.Td2a8ffcontentTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReceived Tffd700{Tffa657lenTb4b4b4(Te6edf3responseTff7b72.Td2a8ffcontentTb4b4b4)Tffd700}Ta5d6ff bytes from serverTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3responseTff7b72.Td2a8ffcontentTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReconnected to server for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72= T79c0ff0

Tff7b72except Te6edf3requestsTff7b72.Td2a8ffexceptionsTff7b72.Td2a8ffRequestException Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72% T79c0ff10 Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError communicating with server for Tffd700{Tff7b72selfTffd700}Ta5d6ff (attempt Tffd700{Tff7b72selfTff7b72.Td2a8ff_consecutive_failuresTffd700}Ta5d6ff): Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3delay Tff7b72= Tffa657minTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpoll_interval Tff7b72* Tb4b4b4(T79c0ff2 Tff7b72*Tff7b72* Tffa657minTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_consecutive_failures Tff7b72- T79c0ff1Tb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_max_backoffTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3delay Tff7b72= Tff7b72selfTff7b72.Td2a8ffpoll_interval

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3delayTb4b4b4)

Tff7b72def Td2a8ffprocess_incomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff0 Tff7b72and Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffmtuTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPayload too large (Tffd700{Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tffd700}Ta5d6ff > Tffd700{Tff7b72selfTff7b72.Td2a8ffmtuTffd700}Ta5d6ff) for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return

Tff7b72selfTff7b72.Td2a8ff_send_queueTff7b72.Td2a8ffputTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDetaching Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False

Tff7b72if Tff7b72selfTff7b72.Td2a8ffmode Tff7b72== Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_http_serverTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ff_http_serverTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_http_serverTff7b72.Td2a8ffshutdownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_http_serverTff7b72.Td2a8ffserver_closeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while shutting down HTTP server for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_server_threadTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ff_server_threadTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_server_threadTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff2Tb4b4b4)

Tff7b72def Td2a8ffshould_ingress_limitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmode Tff7b72== Ta5d6ff"Ta5d6ffserverTa5d6ff"Tb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffHTTPTunnelInterface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff/server/Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8fflisten_portTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffHTTPTunnelInterface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff/client/Tffd700{Tff7b72selfTff7b72.Td2a8ffserver_urlTffd700}Ta5d6ff]Ta5d6ff"

Te6edf3interface_class Tff7b72= Te6edf3HTTPTunnelInterface

Served by rngit 1.5.0 - Generated in 0.08s